﻿using System;
using System.Management;

namespace Eflong.Management
{
    public class Computer
    {
        public string CpuID;
        public string MacAddress;
        public string DiskID;
        public string IpAddress;
        public string LoginUserName;
        public string ComputerName;
        public string SystemType;
        public string TotalPhysicalMemory; //单位：M
        private static Computer _instance;

        public static Computer Instance( )
        {
            if ( _instance == null )
                _instance = new Computer( );
            return _instance;
        }

        public static string KWBRIDGE = "KWBridge";

        public Computer( )
        {
            CpuID = GetCpuID( );
            MacAddress = GetMacAddress( );
            DiskID = GetDiskID( );
            IpAddress = GetIPAddress( );
            LoginUserName = GetUserName( );
            SystemType = GetSystemType( );
            TotalPhysicalMemory = GetTotalPhysicalMemory( );
            ComputerName = GetComputerName( );
        }

        private string GetCpuID( )
        {
            try
            {
                //获取CPU序列号代码
                string cpuInfo = string.Empty;//cpu序列号
                ManagementClass mc = new ManagementClass( "Win32_Processor" );
                ManagementObjectCollection moc = mc.GetInstances( );
                foreach ( ManagementObject mo in moc )
                {
                    cpuInfo = mo.Properties[ "ProcessorId" ].Value.ToString( );
                }
                moc = null;
                mc = null;
                return cpuInfo;
            }
            catch
            {
                return "unknow";
            }
        }

        private string GetMacAddress( )
        {
            try
            {
                //获取网卡硬件地址
                string mac = string.Empty;
                ManagementClass mc = new ManagementClass( "Win32_NetworkAdapterConfiguration" );
                ManagementObjectCollection moc = mc.GetInstances( );
                foreach ( ManagementObject mo in moc )
                {
                    if ( ( bool )mo[ "IPEnabled" ] == true )
                    {
                        mac = mo[ "MacAddress" ].ToString( );
                        break;
                    }
                }
                moc = null;
                mc = null;
                return mac;
            }
            catch
            {
                return "unknow";
            }
        }

        private string GetIPAddress( )
        {
            try
            {
                //获取IP地址
                string st = string.Empty;
                ManagementClass mc = new ManagementClass( "Win32_NetworkAdapterConfiguration" );
                ManagementObjectCollection moc = mc.GetInstances( );
                foreach ( ManagementObject mo in moc )
                {
                    if ( ( bool )mo[ "IPEnabled" ] == true )
                    {
                        System.Array ar = ( System.Array )( mo.Properties[ "IpAddress" ].Value );
                        st = ar.GetValue( 0 ).ToString( );
                        break;
                    }
                }
                moc = null;
                mc = null;
                return st;
            }
            catch
            {
                return "unknow";
            }
        }

        private string GetDiskID( )
        {
            try
            {
                //获取硬盘ID
                String HDid = string.Empty;
                ManagementClass mc = new ManagementClass( "Win32_DiskDrive" );
                ManagementObjectCollection moc = mc.GetInstances( );
                foreach ( ManagementObject mo in moc )
                {
                    HDid = ( string )mo.Properties[ "Model" ].Value;
                }
                moc = null;
                mc = null;
                return HDid;
            }
            catch
            {
                return "unknow";
            }
        }

        /// <summary>
        /// 操作系统的登录用户名
        /// </summary>
        /// <returns></returns>
        private string GetUserName( )
        {
            try
            {
                string st = string.Empty;
                ManagementClass mc = new ManagementClass( "Win32_ComputerSystem" );
                ManagementObjectCollection moc = mc.GetInstances( );
                foreach ( ManagementObject mo in moc )
                {
                    st = mo[ "UserName" ].ToString( );
                }
                moc = null;
                mc = null;
                return st;
            }
            catch
            {
                return "unknow";
            }
        }

        /// <summary>
        /// PC类型
        /// </summary>
        /// <returns></returns>
        private string GetSystemType( )
        {
            try
            {
                string st = string.Empty;
                ManagementClass mc = new ManagementClass( "Win32_ComputerSystem" );
                ManagementObjectCollection moc = mc.GetInstances( );
                foreach ( ManagementObject mo in moc )
                {
                    st = mo[ "SystemType" ].ToString( );
                }
                moc = null;
                mc = null;
                return st;
            }
            catch
            {
                return "unknow";
            }
        }

        /// <summary>
        /// 物理内存
        /// </summary>
        /// <returns></returns>
        private string GetTotalPhysicalMemory( )
        {
            try
            {
                string st = string.Empty;
                ManagementClass mc = new ManagementClass( "Win32_ComputerSystem" );
                ManagementObjectCollection moc = mc.GetInstances( );
                foreach ( ManagementObject mo in moc )
                {
                    st = mo[ "TotalPhysicalMemory" ].ToString( );
                }
                moc = null;
                mc = null;
                return st;
            }
            catch
            {
                return "unknow";
            }
        }

        /// <summary>
        ///
        /// </summary>
        /// <returns></returns>
        private string GetComputerName( )
        {
            try
            {
                return System.Environment.GetEnvironmentVariable( "ComputerName" );
            }
            catch
            {
                return "unknow";
            }
        }
    }
}